package com.jsbs.iam.user.mapper;

import com.jsbs.iam.user.dto.*;
import com.jsbs.iam.user.entity.IamApplySystem;
import com.jsbs.iam.user.vo.ButtonInfoVo;
import com.jsbs.iam.user.vo.MenuManagerInfoVo;
import com.jsbs.iam.user.vo.MenuThreeVo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @BelongsProject: iam
 * @BelongsPackage: com.jsbs.iam.user.mapper
 * @Author: WangJiYuan
 * @Description: TODO
 * @Version: 2023-01-04  18:40
 */
@Mapper
@Repository
public interface MenuManagerMapper {
    /**
     * 获取该应用下的所有菜单
     * @param applyCode
     * @param companyCode
     * @return
     */
    List<MenuThreeVo> selectMenuInfo(@Param("applyCode") String applyCode, @Param("companyCode") String companyCode);

    /**
     * 获取所有按钮数据
     * @param companyCode
     * @return
     */
    List<MenuThreeVo> selectButtonInfo(@Param("applyCode") String applyCode, @Param("companyCode") String companyCode);

    /**
     * 获取应用数据
     * @param applyCode
     * @param companyCode
     * @return
     */
    List<MenuThreeVo> selectApplyInfo(@Param("applyCode") String applyCode, @Param("companyCode") String companyCode);

    /**
     * 校验同级别名称唯一
     *
     * @param menuSuperiorCode
     * @param menuName
     * @param companyCode
     * @return
     */
    int verifyMenuName(@Param("menuSuperiorCode") String menuSuperiorCode, @Param("menuName") String menuName, @Param("companyCode") String companyCode);

    /**
     * 通过应用类型编码查询一级菜单编码
     * @param menuAddDto
     * @return
     */
    String getSubMenuCodeByApplyCode(@Param("menuAddDto") MenuManagerAddDto menuAddDto);

    /**
     * 新增菜单
     * @param menuAddDto
     */
    void addMenuInfo(@Param("menuAddDto") MenuManagerAddDto menuAddDto);

    /**
     * 通过编码获取下级菜单编码
     *
     * @param code
     * @param companyCode
     * @return
     */
    List<String> selectSubMenuCode(@Param("code") String code,@Param("companyCode") String companyCode);

    /**
     * 通过菜单编码逻辑删除菜单数据
     * @param menuDeleteDto
     */
    void deleteMenuInfo(@Param("menuDeleteDto") MenuManagerDeleteDto menuDeleteDto);

    /**
     * 通过菜单编码删除菜单对应按钮数据
     * @param menuDeleteDto
     */
    void deleteButtonInfo(@Param("menuDeleteDto") MenuManagerDeleteDto menuDeleteDto);

    /**
     * 获取菜单详细数据
     *
     * @param menuCode
     * @param companyCode
     * @return
     */
    MenuManagerInfoVo selectMenuData(@Param("menuCode") String menuCode, @Param("companyCode") String companyCode);

    /**
     * 获取菜单名称
     *
     * @param menuCode
     * @param companyCode
     * @return
     */
    String getMenuName(@Param("menuCode") String menuCode, @Param("companyCode") String companyCode);

    /**
     * 修改菜单数据
     * @param menuAddDto
     */
    void updateMenuInfo(@Param("menuAddDto") MenuManagerAddDto menuAddDto);

    /**
     * 根据菜单编码获取对应层级
     * @param menuCode
     * @return
     */
    int verifyMenuLevel(@Param("menuCode") String menuCode);

    /**
     * 修改菜单之间的子父级关系
     * @param menuAddDto
     */
    void updateMenuLevel(@Param("menuAddDto") MenuManagerAddDto menuAddDto);

    /**
     * 通过菜单编码获取按钮数据
     *
     * @param menuCode
     * @param companyCode
     * @return
     */
    List<ButtonInfoVo> selectButtonData(@Param("menuCode") String menuCode, @Param("companyCode") String companyCode);

    /**
     * 校验同级别按钮名称唯一
     *
     * @param menuCode
     * @param buttonName
     * @param companyCode
     * @return
     */
    int verifyButtonName(@Param("menuCode") String menuCode, @Param("buttonName") String buttonName,@Param("companyCode") String companyCode);

    /**
     * 新增按钮数据
     * @param buttonAddDto
     */
    void addButtonInfo(@Param("buttonAddDto") ButtonAddDto buttonAddDto);

    /**
     * 获取按钮名称
     *
     * @param buttonCode
     * @param companyCode
     * @return
     */
    String getButtonName(@Param("buttonCode") String buttonCode, @Param("companyCode") String companyCode);

    /**
     * 修改按钮数据
     * @param buttonAddDto
     */
    void updateButtonInfo(@Param("buttonAddDto") ButtonAddDto buttonAddDto);

    /**
     * 批量删除按钮数据
     * @param buttonDeleteDto
     */
    void deleteButtonData(@Param("buttonDeleteDto") ButtonDeleteDto buttonDeleteDto);

    /**
     * 修改按钮状态
     *
     * @param buttonStatusUpdateDto
     */
    void updateButtonStatus(@Param("buttonStatusUpdateDto") ButtonStatusUpdateDto buttonStatusUpdateDto);

    /**
     * 获取所有应用数据
     *
     * @param companyCode
     * @return
     */
    List<IamApplySystem> getApplyData(@Param("companyCode") String companyCode);

    /**
     * 获取按钮
     * @return
     */
    String selectButtonCode(@Param("companyCode")String companyCode);

    /**
     * 通过菜单父级编码查询下级菜单编码
     * @param menuAddDto
     * @return
     */
    String getSubMenuCodeBySuperCode(@Param("menuAddDto") MenuManagerAddDto menuAddDto);

    /**
     * 获取所有按钮编码集合
     * @param menuDeleteDto
     * @return
     */
    List<String> getButtonCodes(@Param("menuDeleteDto") MenuManagerDeleteDto menuDeleteDto);

    /**
     * 根据应用编码查询应用数据
     * @param adminRoleApplyCodes
     * @param companyCode
     * @return
     */
    List<IamApplySystem> getAdminRoleApplyData(@Param("adminRoleApplyCodes") List<String> adminRoleApplyCodes, @Param("companyCode") String companyCode);
}
